<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // 异步程序：未来的某一时刻执行的程序，有可能成功，也有可能失败，是分情况的，所以会有一些程序需要在异步程序结束之后再执行
    // function fun1(a){
      //   setTimeout(function(){
        //     a()
        //   },3000)
        // }
        // function fun2(){
          //   alert("你好！")
          // }
          // fun1(fun2);
          // console.log("我是同步程序！");

    // 异步中使用回调函数
    // 假定有两个函数f1和f2，后者等待前者的执行结果
    // 如果f1是一个很耗时的任务，可以考虑改写f1，把f2写成f1的回调函数
    function f1(cb){
      setTimeout(function(){
        // f1的任务代码
        alert("我是耗时程序")
        cb()
      },5000)
    }
    function f2(){
      alert("我是回调函数");
    }
    f1(f2);
    // 回调函数的优点是简单、容易理解和部署，缺点是不利于代码的阅读和维护，各个部分之间高度耦合（Coupling），流程会很混乱，而且每个任务只能指定一个回调函数。
  </script>
</body>
</html>